﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Ferreteria.Forms
{
    public partial class frmEmitirComprobante : Form
    {
        DisancoEntities context;

        int numeroComprobanteInicial;
        int numeroComprobanteFinal;
        VentasAdicionales VAImprimir;

        int pedId;
        DataTable dtLineas;
        decimal subtotal;
        private Font printFont = new Font("Calibri", 11);
        private Font FontTit = new Font("Calibri", 12);
        private Font Font = new Font("Calibri", 9);

        public frmEmitirComprobante(int ped_id)
        {
            InitializeComponent();

            context = new DisancoEntities();

            pedId = ped_id;
            var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == ped_id);
            var cliente = pedido.Clientes;

            int nroLineas = pedido.LineaPedido.Count;
            int maxLineas = Clases.Constantes.maximoLineasComprobanteX;

            //Calculo de la cant de facturas necesarias
            int cantFacturas = 1;
            while (nroLineas > maxLineas)
            {
                cantFacturas += 1;
                nroLineas -= maxLineas;
            }

            numeroComprobanteInicial = obtenerNumeroComprobante();
            numeroComprobanteFinal = numeroComprobanteInicial + cantFacturas - 1;

            txbNroFactIni1.Text = numeroComprobanteInicial.ToString("000000000000").Substring(0, 4);
            txbNroFactIni2.Text = numeroComprobanteInicial.ToString("000000000000").Substring(4);

            //txbNroFactFin1.Text = numeroComprobanteFinal.ToString("000000000000").Substring(0, 4);
            //txbNroFactFin2.Text = numeroComprobanteFinal.ToString("000000000000").Substring(4);

            //Cargar datos del cliente
            txtbCliNombre.Text = pedido.Clientes.cliente_nombre;
            txtbCliLocalidad.Text = pedido.Clientes.cliente_localidad;
            txtbCliDireccion.Text = pedido.Clientes.cliente_direccion;
            txtbCliCondiva.Text = pedido.Clientes.CondicionIVA.condicion_sigla;
            txtbCliCuit.Text = pedido.Clientes.cliente_cuit;

            dtLineas = new DataTable();
            dtLineas.Columns.Add("id");
            dtLineas.Columns.Add("Articulo");
            dtLineas.Columns.Add("Cantidad");
            dtLineas.Columns.Add("Precio Unitario");
            dtLineas.Columns.Add("Precio Total");

            subtotal = 0;

            foreach (var linea in pedido.LineaPedido)
            {
                DataRow fila = dtLineas.NewRow();
                fila["id"] = linea.linped_id;
                fila["Articulo"] = linea.Articulos.art_nombre;
                fila["Cantidad"] = linea.ped_cant;
                fila["Precio Unitario"] = "$ " + linea.ped_precio;
                fila["Precio Total"] = "$ " + linea.ped_precio * linea.ped_cant;

                dtLineas.Rows.Add(fila);

                subtotal += linea.ped_precio * linea.ped_cant;
            }

            dgvListaArt.DataSource = dtLineas;
            dgvListaArt.Columns["id"].Visible = false;
            dgvListaArt.Columns["Articulo"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;


            dgvListaArt.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvListaArt.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

            txbSubTotal.Text = "$ " + Math.Round(subtotal, 2);

            calcularTotales();
        }

        int obtenerNumeroComprobante()
        {
            int numero = 0;

            foreach (var c in context.VentasAdicionales)
            {
                if (c.va_nro_comp_ini > numero)
                    numero = c.va_nro_comp_ini ;
            }
            return numero + 1;
        }

        void calcularTotales()
        {
            txbTotal.Text = "$ " + subtotal.ToString();
        }

        void cargarLineasPedido()
        {
            dtLineas.Rows.Clear();
            context = new DisancoEntities();

            var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == pedId);

            foreach (var linea in pedido.LineaPedido)
            {
                DataRow fila = dtLineas.NewRow();
                fila["id"] = linea.linped_id;
                fila["Articulo"] = linea.Articulos.art_nombre;
                fila["Cantidad"] = linea.ped_cant;
                fila["Precio Unitario"] = "$ " + linea.ped_precio;
                fila["Precio Total"] = "$ " + linea.ped_precio * linea.ped_cant;

                dtLineas.Rows.Add(fila);
            }

            dgvListaArt.DataSource = dtLineas;
            dgvListaArt.Columns["id"].Visible = false;
            dgvListaArt.Columns["Articulo"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
        }

        private void btnEmitir_Click(object sender, EventArgs e)
        {
            try
            {
                context = new DisancoEntities();
                var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == pedId);

                bool valido = true;
                string lista = "Stock insuficiente para los siguientes articulos:\n";

                //Verificar existencia de stock
                foreach (var linea in pedido.LineaPedido)
                {
                    if (linea.ped_cant > linea.Articulos.art_stock)
                    {
                        valido = false;
                        lista += linea.Articulos.art_nombre + " (" + linea.Articulos.art_stock.ToString() + ")\n";
                    }
                }

                if (valido)
                {
                    //Actualizar stock de cada articulo
                    foreach (var linea in pedido.LineaPedido)
                    {
                        linea.Articulos.art_stock -= linea.ped_cant;
                    }

                    //Registrar la nueva factura
                    VentasAdicionales nuevaVentaAdicional = new VentasAdicionales();
                    nuevaVentaAdicional.cliente_id = pedido.cliente_id;
                    nuevaVentaAdicional.va_fecha = DateTime.Now;
                    nuevaVentaAdicional.va_descuento = 0;
                    nuevaVentaAdicional.va_estado = Clases.Estado.Emitida;
                    nuevaVentaAdicional.va_nro_comp_ini = numeroComprobanteInicial;

                    nuevaVentaAdicional.va_nro_comp_fin = numeroComprobanteFinal;
                    nuevaVentaAdicional.va_subtotal = subtotal;
                    nuevaVentaAdicional.va_forma_pago = Clases.FormasDePago.CuentaCorriente;

                    foreach (var lineaPedido in pedido.LineaPedido)
                    {
                        LineaVentaAdicional nuevaLineaVentaAdicional = new LineaVentaAdicional();
                        nuevaLineaVentaAdicional.art_id = lineaPedido.art_id;
                        nuevaLineaVentaAdicional.linva_cant = lineaPedido.ped_cant;
                        nuevaLineaVentaAdicional.linva_precio = lineaPedido.ped_precio;

                        nuevaVentaAdicional.LineaVentaAdicional.Add(nuevaLineaVentaAdicional);
                    }
                    pedido.ped_estado = Clases.Estado.Emitida;

                    context.VentasAdicionales.AddObject(nuevaVentaAdicional);
                    context.SaveChanges();
                    VAImprimir = new VentasAdicionales();
                    VAImprimir = nuevaVentaAdicional;
                    MessageBox.Show("Comprobante guardado con exito", "Operación Exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                    this.Close();
                    ImprimirComprobante();
                }
                else
                {
                    MessageBox.Show(lista);
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString());
            }
        }

        private void ImprimirComprobante()
        {

            printDialogCompX.Document = printDocumentX;

            // Si hay q imprimir un Comprobante 
            DialogResult resultunico = printDialogCompX.ShowDialog();

            if (resultunico == DialogResult.OK)
            {
                printDocumentX.PrinterSettings = printDialogCompX.PrinterSettings;
                printPrevDCompX.Document = printDocumentX;
                ((Form)printPrevDCompX).WindowState = FormWindowState.Maximized;
                printPrevDCompX.ShowDialog();
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void printDocumentX_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            context = new DisancoEntities();

            int margenX = 50;
            int margenY = 50;
            int anchoHoja = 800;

            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            e.Graphics.DrawImage(pictureBox1.Image, 10,30);

            e.Graphics.DrawString("Documento No Valido Como Factura", Font, Brushes.Black, 310, 20);
            e.Graphics.DrawString(" X ", FontTit, Brushes.Black, 400, 7);

            string comprobnumero = numeroComprobanteInicial.ToString("0000-00000000");
            e.Graphics.DrawString(comprobnumero, printFont, Brushes.Black, 550, 40);
            e.Graphics.DrawString("Número:", printFont, Brushes.Black, 520, 40, formato);

            string fecha = DateTime.Now.Date.ToString("dd/MM/yyyy");
            e.Graphics.DrawString("Fecha:", printFont, Brushes.Black, 525,70, formato);
            e.Graphics.DrawString(fecha, printFont, Brushes.Black, 550, 70); 
            
            e.Graphics.DrawLine(Pens.Black, 10, 120, 800, 120);
            e.Graphics.DrawString(VAImprimir.Clientes.cliente_nombre, printFont, Brushes.Black, 130, 130);

            e.Graphics.DrawString(VAImprimir.Clientes.cliente_direccion, printFont, Brushes.Black, 130, 150);
            e.Graphics.DrawString(VAImprimir.Clientes.cliente_localidad, printFont, Brushes.Black, 550, 150);
            e.Graphics.DrawString(VAImprimir.Clientes.CondicionIVA.condicion_sigla, printFont, Brushes.Black, 130, 170);
            e.Graphics.DrawString(VAImprimir.Clientes.cliente_cuit, printFont, Brushes.Black, 550, 170);
            e.Graphics.DrawLine(Pens.Black, 10, 200, 800, 200);

            e.Graphics.DrawString("Cliente:", printFont, Brushes.Black, 90, 130, formato);
            e.Graphics.DrawString("Dirección:", printFont, Brushes.Black,80 , 150, formato);
            e.Graphics.DrawString("Localidad:", printFont, Brushes.Black,500 , 150, formato);
            e.Graphics.DrawString("Cond. IVA:", printFont, Brushes.Black, 80, 170, formato);
            e.Graphics.DrawString("CUIT:", printFont, Brushes.Black, 520, 170, formato);

            int lnverticalesIn = 208;
            int lnverticalesFin = 980;
            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, printFont, Brushes.Black, 82, 210);
            e.Graphics.DrawLine(Pens.Gray, 155, lnverticalesIn, 155, lnverticalesFin);

            String Cod = "Codigo Art.";
            e.Graphics.DrawString(Cod, printFont, Brushes.Black, 180, 210);
            e.Graphics.DrawLine(Pens.Gray, 265, lnverticalesIn, 265, lnverticalesFin);

            String Art = "Articulo";
            e.Graphics.DrawString(Art, printFont, Brushes.Black, 400, 210);
            e.Graphics.DrawLine(Pens.Gray, 585, lnverticalesIn, 585, lnverticalesFin);

            String PrecioU = "Precio U";
            e.Graphics.DrawString(PrecioU, printFont, Brushes.Black, 600, 210);
            e.Graphics.DrawLine(Pens.Gray, 680, lnverticalesIn, 680, lnverticalesFin);

            String Importe = "Importe";
            e.Graphics.DrawString(Importe, printFont, Brushes.Black, 700, 210);
            e.Graphics.DrawLine(Pens.Gray, 780, lnverticalesIn, 780, lnverticalesFin);

            //dibujado de las lineas de factura
            int posY = 230;
            int anchoLinea = 25;
            int posCantidad = margenX + 55;
            int posArticulo = posCantidad + 175;

            int posPrecioU = posArticulo + 328;
            int posPrecioT = posPrecioU + 100;

            
            foreach (DataRow fila in dtLineas.Rows)
            {
                e.Graphics.DrawString(fila["Cantidad"].ToString(), printFont, Brushes.Black, posCantidad, posY);
                e.Graphics.DrawString(fila["Articulo"].ToString(), printFont, Brushes.Black, posArticulo, posY);
                e.Graphics.DrawString(fila["Precio Unitario"].ToString(), printFont, Brushes.Black, posPrecioU, posY);
                e.Graphics.DrawString(fila["Precio Total"].ToString(), printFont, Brushes.Black, posPrecioT, posY);

                posY += anchoLinea;
            }

            int lineafin = 1000;
            int posSubtotX = 80;

            String tot = "TOTAL  $";
            e.Graphics.DrawString(tot, printFont, Brushes.Black, posSubtotX + 570, lineafin);
            decimal total = Decimal.Round(Convert.ToDecimal(VAImprimir.va_monto), 2);
            e.Graphics.DrawString(Convert.ToString(total), printFont, Brushes.Black, posSubtotX + 645, lineafin);


        }
    }
}
